package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"

	"ipparse/internal/core"
	"ipparse/internal/utils"
)

func main() {
	// 检查命令行参数
	if len(os.Args) != 2 {
		fmt.Fprintf(os.Stderr, "使用方法: %s <logfile>\n", os.Args[0])
		fmt.Fprintf(os.Stderr, "示例: %s output.log\n", os.Args[0])
		os.Exit(1)
	}

	logfile := os.Args[1]

	// 创建日志写入器
	logger, err := utils.NewLogger(logfile)
	if err != nil {
		fmt.Fprintf(os.Stderr, "无法创建日志文件 %s: %v\n", logfile, err)
		os.Exit(1)
	}
	defer logger.Close()

	// 创建数据包捕获器
	capture, err := core.NewPacketCapture()
	if err != nil {
		fmt.Fprintf(os.Stderr, "无法创建数据包捕获器: %v\n", err)
		fmt.Fprintf(os.Stderr, "提示: 此程序需要root权限才能创建原始套接字\n")
		os.Exit(1)
	}
	defer capture.Close()

	// 设置信号处理，监听Ctrl+C
	signalChan := make(chan os.Signal, 1)
	signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

	fmt.Println("IP数据包解析程序已启动...")
	fmt.Printf("日志文件: %s\n", logfile)
	fmt.Println("按 Ctrl+C 退出程序")
	fmt.Println("开始捕获IP数据包...")

	packetCount := 0

	// 主循环
	for {
		select {
		case <-signalChan:
			fmt.Printf("\n\n收到退出信号，正在安全退出...\n")
			fmt.Printf("总共捕获了 %d 个IP数据包\n", packetCount)
			return

		default:
			// 尝试读取数据包
			data, addr, err := capture.ReadPacket()
			if err != nil {
				fmt.Printf("读取数据包时出错: %v\n", err)
				continue
			}

			// 解析IP数据包
			pkg, err := core.ParseIPPackage(data)
			if err != nil {
				fmt.Printf("解析数据包失败: %v\n", err)
				continue
			}

			packetCount++

			// 格式化输出
			output := core.FormatIPPackage(pkg, packetCount, addr.String())

			// 写入日志文件
			if err := logger.Write(output); err != nil {
				fmt.Fprintf(os.Stderr, "写入日志文件失败: %v\n", err)
			}
		}
	}
}
